package uade.distribuidas.server.domain;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import uade.distribuidas.repo.dto.CondicionVentaDTO;
import uade.distribuidas.repo.dto.FacturaDTO;
import uade.distribuidas.repo.dto.ItemFacturaDTO;
import uade.distribuidas.repo.type.EnvioType;
import uade.distribuidas.repo.type.EstadoFacturaType;
/**
 * 
 */

@Entity
@Table(name="facturas")
public class Factura  implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name = "idsolicitud")
	private Integer id;
	
	@Column(name = "numero")
	private String numero;
	
	@ManyToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="idcliente")
	private Cliente cliente;
	
	@Column(name="emision")
	private Date emision;
	
	@Column(name="envio") 
	@Enumerated(EnumType.STRING) 
	private EnvioType envio;
	
	@Column(name="estado") 
	@Enumerated(EnumType.STRING) 
	private EstadoFacturaType estado;
	
	
	@OneToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="idremito")
	private RemitoODV remito;
	
	@Column(name="tipopago") 
	private String tipoPago;
	
	@Column(name="vencimiento") 
	private Date vencimiento;
	
	@OneToMany(cascade=CascadeType.ALL)
	@JoinColumn(name="idfactura")
	private List<ItemFactura> items;
	
	@Column(name="total") 
	private float total;
	
	@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(name = "facturas_condiciones",
	joinColumns = { 
			@JoinColumn(name = "idfactura", nullable = false, updatable = false) 
			}, 
	inverseJoinColumns = { 
			@JoinColumn(name = "idcondicion",nullable = false, updatable = false) 
			}
	)
	private List<CondicionVenta> condiciones;	
	public Factura() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Cliente getCliente() {
		return cliente;
	}
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	public Date getEmision() {
		return emision;
	}
	public void setEmision(Date emision) {
		this.emision = emision;
	}
	public EnvioType getEnvio() {
		return envio;
	}
	public void setEnvio(EnvioType envio) {
		this.envio = envio;
	}
	public EstadoFacturaType getEstado() {
		return estado;
	}
	public void setEstado(EstadoFacturaType estado) {
		this.estado = estado;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public RemitoODV getRemito() {
		return remito;
	}
	public void setRemito(RemitoODV remito) {
		this.remito = remito;
	}
	public String getTipoPago() {
		return tipoPago;
	}
	public void setTipoPago(String tipoPago) {
		this.tipoPago = tipoPago;
	}
	public Date getVencimiento() {
		return vencimiento;
	}
	public void setVencimiento(Date vencimiento) {
		this.vencimiento = vencimiento;
	}
	public List<ItemFactura> getItems() {
		return items;
	}
	public void setItems(List<ItemFactura> items) {
		this.items = items;
	}
	public float getTotal() {
		return total;
	}
	public void setTotal(float total) {
		this.total = total;
	}
	public void calcularTotal() {
		for (ItemFactura i : this.items) {
			this.total +=i.getPrecioUnidad()*i.getCantidad();
		}
		
	}
	public List<CondicionVenta> getCondiciones() {
		return condiciones;
	}
	public void setCondiciones(List<CondicionVenta> condiciones) {
		this.condiciones = condiciones;
	}
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
    
    public FacturaDTO getVista(){
    	FacturaDTO dto = new FacturaDTO();
    	dto.setCliente(cliente.getVista());
    	List<CondicionVentaDTO> ventas=new ArrayList<CondicionVentaDTO>();
    	for(CondicionVenta c:condiciones){
    		ventas.add(c.getVista());
    	}
    	dto.setCondiciones(ventas);
    	dto.setEmision(emision);
    	dto.setEnvio(envio);
    	dto.setEstado(estado);
    	dto.setId(id);
    	List<ItemFacturaDTO> itemsf=new ArrayList<ItemFacturaDTO>();
    	for(ItemFactura c:items){
    		itemsf.add(c.getVista());
    	}
    	dto.setItems(itemsf);
    	dto.setNumero(numero);
    	dto.setRemito(remito.getVista());
    	dto.setTipoPago(tipoPago);
    	dto.setTotal(total);
    	dto.setVencimiento(vencimiento);
    	return dto;
    }
    
}
